package com.app.utiles.sound;

import android.media.MediaRecorder;
import android.os.Environment;

import com.app.utiles.other.DLog;
import com.app.utiles.other.FileUtile;

import java.io.File;
import java.io.IOException;

/**
 * WAV格式：录音质量高，但是压缩率小，文件大
 * <p>
 * AAC格式：相对于mp3，AAC格式的音质更佳，文件更小；有损压缩；一般苹果或者Android SDK4.1.2（API 16）及以上版本支持播放
 * <p>
 * AMR格式：压缩比比较大，但相对其他的压缩格式质量比较差，多用于人声，通话录音
 * <p>
 * 至于常用的mp3格式，使用MediaRecorder没有该视频格式输出。一些人的做法是使用AudioRecord录音，然后编码成wav格式，再转换成mp3格式
 * <p>
 * 录制声音
 */
public class SoundMeter {

    private MediaRecorder mediaRecorder = null;
    /**
     * 声音文件再sd卡上的路径
     */
    public String fileName;

    /**
     * 开始录音
     *
     * @param name 文件名称
     */
    public void start(String name) {
        fileName = FileUtile.getVoiceCacheFileName(name) + ".amr";
        if (!Environment.getExternalStorageState().equals(
                android.os.Environment.MEDIA_MOUNTED)) {
            return;
        }
        if (mediaRecorder == null) {// 设置MediaRecorder属性
            mediaRecorder = new MediaRecorder();
            mediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
            mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);
            mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
            // mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.AAC_ADTS);
            //mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
        }

        mediaRecorder.setOutputFile(fileName);
        try {
            mediaRecorder.prepare();
            mediaRecorder.start();
        } catch (IllegalStateException e) {
            System.out.print(e.getMessage());
        } catch (IOException e) {
            System.out.print(e.getMessage());
        }

    }

    /**
     * 停止录音
     *
     * @param isDelete true 删除录音文件
     */
    public void stop(boolean isDelete) {

        if (mediaRecorder == null) {
            return;
        }
        try {
            mediaRecorder.setOnErrorListener(null);
            mediaRecorder.setPreviewDisplay(null);
            mediaRecorder.stop();
            mediaRecorder.release();
            mediaRecorder = null;
        } catch (Exception e) {
            fileName = "";
            mediaRecorder = null;
            DLog.e("录音错误" + e.getMessage(), "------------");
        }
        if (!isDelete) {
            return;
        }
        File file = new File(fileName);
        if (file.exists()) {
            file.delete();
        }
    }

    /**
     * 获取录音声音强度
     */
    /*public double getAmplitude() {
        if (mediaRecorder != null) {
            //0到32767范围的16位整型
            return 5 * (mediaRecorder.getMaxAmplitude() / 32768 + 0.5);
        } else {
            return 0;
        }

    }*/
    public double getAmplitude() {
        if (mediaRecorder != null) {
            return (mediaRecorder.getMaxAmplitude() / 2700.0);
        } else {
            return 0;
        }

    }
}
